package com.blog.cmrpersonalblog.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.blog.cmrpersonalblog.dto.announcement.request.*;
import com.blog.cmrpersonalblog.dto.announcement.response.AnnouncementResponse;
import com.blog.cmrpersonalblog.dto.announcement.response.UserAnnouncementMessageResponse;

import java.util.List;
import java.util.Map;

/**
 * 公告服务接口
 */
public interface AnnouncementService {

    /**
     * 创建公告
     * @param createRequest 创建请求
     * @param creatorId 创建人ID
     * @param creatorName 创建人姓名
     * @return 创建结果
     */
    boolean createAnnouncement(AnnouncementCreateRequest createRequest, Long creatorId, String creatorName);

    /**
     * 更新公告
     * @param updateRequest 更新请求
     * @return 更新结果
     */
    boolean updateAnnouncement(AnnouncementUpdateRequest updateRequest);

    /**
     * 删除公告（逻辑删除）
     * @param announcementId 公告ID
     * @param operatorId 操作人ID
     * @param operatorName 操作人姓名
     * @return 删除结果
     */
    boolean deleteAnnouncement(Long announcementId, Long operatorId, String operatorName);

    /**
     * 批量操作公告
     * @param batchRequest 批量操作请求
     * @return 操作结果
     */
    Map<String, Object> batchOperateAnnouncements(AnnouncementBatchOperationRequest batchRequest);

    /**
     * 分页查询公告列表（管理员）
     * @param queryRequest 查询条件
     * @return 公告分页列表
     */
    IPage<AnnouncementResponse> getAnnouncementList(AnnouncementQueryRequest queryRequest);

    /**
     * 分页查询有效公告列表（用户）
     * @param queryRequest 查询条件
     * @param userId 用户ID
     * @return 公告分页列表
     */
    IPage<AnnouncementResponse> getValidAnnouncementList(AnnouncementQueryRequest queryRequest, Long userId);

    /**
     * 获取公告详情
     * @param announcementId 公告ID
     * @param userId 用户ID（可为null）
     * @return 公告详情
     */
    AnnouncementResponse getAnnouncementDetail(Long announcementId, Long userId);

    /**
     * 获取置顶公告列表
     * @param targetAudience 目标受众
     * @param userId 用户ID（可为null）
     * @return 置顶公告列表
     */
    List<AnnouncementResponse> getTopAnnouncements(String targetAudience, Long userId);

    /**
     * 获取弹窗公告列表
     * @param targetAudience 目标受众
     * @param userId 用户ID
     * @return 弹窗公告列表
     */
    List<AnnouncementResponse> getPopupAnnouncements(String targetAudience, Long userId);

    /**
     * 标记公告为已读
     * @param announcementId 公告ID
     * @param userId 用户ID
     * @return 操作结果
     */
    boolean markAnnouncementAsRead(Long announcementId, Long userId);

    /**
     * 标记所有公告为已读
     * @param userId 用户ID
     * @param targetAudience 目标受众
     * @return 操作结果
     */
    boolean markAllAnnouncementsAsRead(Long userId, String targetAudience);

    /**
     * 获取用户未读公告数量
     * @param userId 用户ID
     * @param targetAudience 目标受众
     * @return 未读公告数量
     */
    int getUnreadAnnouncementCount(Long userId, String targetAudience);

    /**
     * 发布公告
     * @param announcementId 公告ID
     * @param operatorId 操作人ID
     * @param operatorName 操作人姓名
     * @return 发布结果
     */
    boolean publishAnnouncement(Long announcementId, Long operatorId, String operatorName);

    /**
     * 存档公告（设为已过期）
     * @param announcementId 公告ID
     * @param operatorId 操作人ID
     * @param operatorName 操作人姓名
     * @return 存档结果
     */
    boolean archiveAnnouncement(Long announcementId, Long operatorId, String operatorName);

    /**
     * 置顶/取消置顶公告
     * @param announcementId 公告ID
     * @param isTop 是否置顶
     * @param operatorId 操作人ID
     * @param operatorName 操作人姓名
     * @return 操作结果
     */
    boolean toggleAnnouncementTop(Long announcementId, boolean isTop, Long operatorId, String operatorName);

    /**
     * 设置/取消弹窗公告
     * @param announcementId 公告ID
     * @param isPopup 是否弹窗
     * @param operatorId 操作人ID
     * @param operatorName 操作人姓名
     * @return 操作结果
     */
    boolean toggleAnnouncementPopup(Long announcementId, boolean isPopup, Long operatorId, String operatorName);

    /**
     * 自动过期公告
     * @return 过期的公告数量
     */
    int autoExpireAnnouncements();

    /**
     * 获取公告统计信息
     * @return 统计信息
     */
    Map<String, Object> getAnnouncementStatistics();

    /**
     * 清理已删除的公告（物理删除）
     * @param daysBeforeClean 删除多少天前的记录
     * @return 清理的公告数量
     */
    int cleanDeletedAnnouncements(int daysBeforeClean);

    /**
     * 清理过期的阅读记录
     * @param daysBeforeClean 清理多少天前的记录
     * @return 清理的记录数量
     */
    int cleanExpiredReadRecords(int daysBeforeClean);

    /**
     * 忽略公告
     * @param announcementId 公告ID
     * @param userId 用户ID
     * @return 操作结果
     */
    boolean ignoreAnnouncement(Long announcementId, Long userId);

    /**
     * 取消忽略公告
     * @param announcementId 公告ID
     * @param userId 用户ID
     * @return 操作结果
     */
    boolean cancelIgnoreAnnouncement(Long announcementId, Long userId);

    /**
     * 分页查询用户消息中心公告列表
     * @param queryRequest 查询条件
     * @param userId 用户ID
     * @param targetAudience 目标受众
     * @return 公告分页列表
     */
    IPage<UserAnnouncementMessageResponse> getUserMessageAnnouncementList(
        UserAnnouncementMessageQueryRequest queryRequest,
        Long userId,
        String targetAudience
    );
}
